package array.prefixsum;

import java.util.HashMap;

public class FindMaxLength {

    public int findMaxLength(int[] nums) {
        int n = nums.length;
        int[] preSum = new int[n + 1];
        preSum[0] = 0;
        // 计算 nums 的前缀和
        for (int i = 1; i <= n; i++) {
            preSum[i] = preSum[i - 1] + (nums[i - 1] == 0 ? -1 : 1);
        }
        // 前缀和到索引的映射，方便快速查找所需要的前缀积
        HashMap <Integer, Integer> map = new HashMap<>();
        int res = 0;
        for (int i = 0; i < preSum.length; i++) {
            // 如果这个前缀和还没有对应的索引，则记录下来
            if (!map.containsKey(preSum[i])) {
                map.put(preSum[i], i);
            } else {
                // 否则，计算当前索引和之前索引的差值，并更新结果
                res = Math.max(res, i - map.get(preSum[i]));
            }

            // 因为题目想要最长子数组，所以前缀和索引应该尽可能小
        }

        return res;
    }
}
